#ifndef __MODBUSREG_H
#define __MODBUSREG_H

#ifdef __cplusplus
extern "C" {
#endif

	
	
#define MANUFACTURER_ID_DEFAULT_VALUE						(0x4343)    //in computer config/devicelist.xml MID value
#define MODEL_NUMBER_DEFAULT_VALUE     					(4003)
#define HARDWARE_REVISION_NUMBER_DEFAULT_VALUE 	(0x4300)  
#define FIRMWARE_REVISION_NUMBER_DEFAULT_VALUE 	(0x1000)   
#define PCBA_MANUFACTURING_DATE_CODE_VALUE 			(0X2224)  	//make on week 24, 2022
#define PCBA_SERIAL_NUMBER_VALUE 								(0x0001)
         

#pragma pack(push, 1)	
typedef struct
{
	uint16_t MANUFACTURER_ID;
  uint16_t MODEL_NUMBER;
  
  uint16_t HARDWARE_REVISION_NUMBER;
  uint16_t FIRMWARE_REVISION_NUMBER;
  
  uint16_t PCBA_MANUFACTURING_DATE_CODE;
  uint16_t PCBA_SERIAL_NUMBER;
	
	uint16_t RETAIN1;
	uint16_t RETAIN2;

  uint16_t MODBUS_ADDRESS;
	uint16_t MODBUS_BAUD_RATE;
	uint16_t MODBUS_RESET;
  uint16_t MODBUS_DELAY_REPLY;
	uint16_t MODBUS_T35;
}AppDeviceInfos;
#pragma pack(pop)



#pragma pack(push, 1)
typedef struct {
	float TDB;                    	//干球温度
	float TDP;                    	//露点温度
	float TWB;                    	//湿球温度
	float HR;                     	//含湿量
	float RH;                    		//相对湿度
	float H;                      	//焓值
	
	uint16_t SensorFault;				    //温度传感器故障
	uint32_t SensorFaultCnt;    		//温度传感器累计故障次数
	
	uint16_t CommFault;             //无线通讯故障
	uint32_t CommFaultCnt;    		  //累计无线通讯故障次数

  int16_t Rssi;                   //无线从机模式时，设备信号强度
} tAtpsParameter;
#pragma pack(pop)



#pragma pack(push, 1)
typedef struct
{
	tAtpsParameter AtpsSaParam;
  tAtpsParameter AtpsOaParam;			  //新风ATPS信息
	tAtpsParameter AtpsRaParam;			  //回风ATPS信息
	tAtpsParameter AtpsMaParam;			  //混风ATPS信息
	tAtpsParameter AtpsExaParam;			//排风ATPS信息
	tAtpsParameter AtpsRoomaParam;		//室内ATPS信息
	tAtpsParameter AtpsCoolaParam;		//表冷后ATPS信息
	tAtpsParameter AtpsHeataParam;		//加热后ATPS信息
	tAtpsParameter AtpsHumaParam;		  //加湿后ATPS信息
	tAtpsParameter AtpsPreParam;			//预处理后ATPS信息
	tAtpsParameter AtpsRotParam;			//转轮后ATPS信息
}AppInputs;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
  uint16_t Reserved;
}AppOutputs;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
	uint16_t Reserved;
}AppCalibrations;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
  uint16_t Reserved;
}AppAlarms;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
  uint16_t NVS_Fault;					    //NVS存储故障
  uint32_t SysRunTime;				    //系统累计运行时间，单位：s
  uint16_t NetConnectFlag;				  //无线从机模式时，网络连接标志。	0--失败		1--成功
  float ChipTemp;
}AppStatus;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
  uint16_t Parity;           	/**MODBUS串口校验位: 0--无		1--奇校验		2--偶校验 */
  uint16_t StopBits;     	  	/**MODBUS串口停止位   */
  uint32_t Baudrate;			    /**MODBUS串口波特率   */
  uint16_t TxdDelay;			    /**MODBUS串口数据延时发送时间，单位：ms   */
  uint16_t T35Time;			      /**MODBUS t35时间，超过这个值，则判断为一帧数据接收完成，单位：ms   */
                              /**0--数据无效，由程序自动计算时间   */
                              /**其他数值--有效   */       
} tModbusRtuSlaveParameter;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct {
   uint16_t WorkMode;        	/**ATPS工作模式：0--RS485通讯	1--无线从机		2--无线主机 */
   uint16_t NetId;           	/**无线网络ID */
   uint16_t NetChannel;        /**无线网络通道号 */
   uint16_t DeviceType;     		/**设备类型 */
   uint16_t SensorType;     		/**传感器类型 */
} tWorkParameter;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct {
   uint32_t ResetCount;        	/**系统复位重启次数 */
   
   float AtpsSaTempCali;        /**送风温度校准，单位：℃ */
   float AtpsSaRhCali;     		/**送风相对湿度校准，单位：%  */
   
   float AtpsOaTempCali;        /**新风温度校准，单位：℃ */
   float AtpsOaRhCali;     		/**新风相对湿度校准，单位：%  */
   
   float AtpsRaTempCali;        /**回风温度校准，单位：℃ */
   float AtpsRaRhCali;     		/**回风相对湿度校准，单位：%  */
   
   float AtpsMaTempCali;        /**混风温度校准，单位：℃ */
   float AtpsMaRhCali;     		/**混风相对湿度校准，单位：%  */
   
   float AtpsExaTempCali;       /**排风温度校准，单位：℃ */
   float AtpsExaRhCali;     	/**排风相对湿度校准，单位：%  */
   
   float AtpsRoomaTempCali;     /**室内温度校准，单位：℃ */
   float AtpsRoomaRhCali;     	/**室内相对湿度校准，单位：%  */
   
   float AtpsCoolaTempCali;     /**表冷后温度校准，单位：℃ */
   float AtpsCoolaRhCali;     	/**表冷后相对湿度校准，单位：%  */
   
   float AtpsHeataTempCali;     /**加热后温度校准，单位：℃ */
   float AtpsHeataRhCali;     	/**加热后相对湿度校准，单位：%  */
   
   float AtpsHumaTempCali;      /**加湿后温度校准，单位：℃ */
   float AtpsHumaRhCali;     	/**加湿后相对湿度校准，单位：%  */
   
   float AtpsPreTempCali;       /**预处理后温度校准，单位：℃ */
   float AtpsPreRhCali;     	/**预处理后相对湿度校准，单位：%  */
   
   float AtpsRotTempCali;       /**转轮后温度校准，单位：℃ */
   float AtpsRotRhCali;     	/**转轮后相对湿度校准，单位：%  */
   
   float Atmosphere;            /**大气压值，单位：KPa  */
   
   uint16_t SamplingPeriod;		/**传感器数据采样时间间隔，单位：ms  */
   uint16_t AverageWindowSize;	/**移动平均窗口大小  */   
} tAppParameter;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
  tModbusRtuSlaveParameter ModbusRtuSlaveParam;
	tWorkParameter WorkParam;
  tAppParameter AppParam;
}AppSettings;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
  uint16_t Reserved;
} AppOverrides;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
  int16_t debug_rw_value[10];
}DebudRWs;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
  uint16_t debug_ro_value[10];
}DebudROs;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct
{
  uint16_t Reserved;
}AppAnlogInputCalibrations;
#pragma pack(pop)


#pragma pack(push, 1)
typedef struct 
{
  uint16_t Reserved;
}AppAnlogOutputCalibrations;
#pragma pack(pop)




/**
  * @brief MODBUS--读输入寄存器回调函数
  * @param pucRegBuffer：存放读取的寄存器数据
	* @param usAddress：输入寄存器地址
	* @param usNRegs：读取寄存器的数量
  * @retval 
  */
int8_t eMBRegInputCB( uint8_t *pucRegBuffer, uint16_t usAddress, uint16_t usNRegs );



/**
  * @brief MODBUS--读写保持寄存器回调函数
  * @param pucRegBuffer：存放寄存器数据
	* @param usAddress：寄存器地址
	* @param usNRegs：寄存器数量
	* @param eMode：寄存器操作模式
  * @retval 
  */
int8_t eMBRegHoldingCB( uint8_t * pucRegBuffer, uint16_t usAddress, uint16_t usNRegs, uint8_t eMode );
	
	
	
/**
  * @brief MODBUS--读写线圈寄存器回调函数
  * @param pucRegBuffer：存放寄存器数据
	* @param usAddress：寄存器地址
	* @param usNCoils：寄存器数量
	* @param eMode：寄存器操作模式
  * @retval 
  */
int8_t eMBRegCoilsCB( uint8_t *pucRegBuffer, uint16_t usAddress, uint16_t usNCoils, uint8_t eMode );	



/**
  * @brief MODBUS--读离散输入寄存器回调函数
  * @param pucRegBuffer：存放寄存器数据
	* @param usAddress：寄存器地址
	* @param usNDiscrete：寄存器数量
  * @retval 
  */
int8_t eMBRegDiscreteCB( uint8_t *pucRegBuffer, uint16_t usAddress, uint16_t usNDiscrete );
	


#ifdef __cplusplus
}
#endif

#endif 	
	
	
	
	